package com.lagou.edu.spring.core;

import java.util.List;

/**
 * bean的定义信息注册中心
 *
 * @author 大犬
 * @date 2020/3/31
 */
public interface BeanDefinitionRegistry {

    default void register(BeanDefinition beanDefinition) {
        register(beanDefinition.getBeanName(), beanDefinition);
    }

    /**
     * 注册bean定义信息
     *
     * @param beanName       bean名称
     * @param beanDefinition bean的定义信息
     */
    void register(String beanName, BeanDefinition beanDefinition);

    /**
     * 获取bean的定义信息
     *
     * @param beanName
     * @return 返回bean定义信息
     */
    BeanDefinition getBeanDefinition(String beanName);

    /**
     * 获取所有bean的定义信息
     *
     * @return 返回所有bean的定义信息
     */
    List<BeanDefinition> getAllBeanDefinitions();

    /**
     * 根据类型获取bean的定义信息
     *
     * @param type 类型
     * @return 返回该类型的所有的bean定义信息
     */
    List<BeanDefinition> getBeanDefinitions(Class type);

    /**
     * 获取所有bean的名称
     *
     * @return 返回所有bean的名称
     */
    List<String> getAllBeanNames();

    /**
     * 根据类型获取所有beanName
     *
     * @param type 类型
     * @return 返回beanName
     */
    List<String> getBeanNames(Class type);

    /**
     * 清空所有bean的定义信息
     */
    void clear();

    /**
     * 冻结
     */
    void freeze();
}
